package com.koron.tool.util;


import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.support.ExcelTypeEnum;
import com.koron.bean.base.Response;
import com.koron.bean.system.staff.vo.EamUser;
import com.koron.bean.util.GetHardwareIdFailedException;
import com.koron.bean.util.InvalidSystemClockException;
import com.koron.common.core.annocation.CasUser;
import com.koron.tool.bean.ToolGroupBean;
import com.koron.tool.bean.TypeIdSaveBean;
import com.koron.tool.service.ToolAccountsManagerService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.koron.ebs.mybatis.ADOConnection;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import springfox.documentation.annotations.ApiIgnore;

import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.net.URLEncoder;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.UUID;

@Slf4j
@Api(tags = "excel管理")
@RestController
@RequestMapping("/excel")
public class ExcelUtil {
    @Autowired
    private ToolAccountsManagerService service;
    /**
     * 文件下载（失败了会返回一个有部分数据的Excel）
     * <p>
     * 1. 创建excel对应的实体对象 参照{@link}
     * <p>
     * 2. 设置返回的 参数
     * <p>
     * 3. 直接写，这里注意，finish的时候会自动关闭OutputStream,当然你外面再关闭流问题不大
     */
    @SneakyThrows
    @ApiOperation(value = "工器具下载模板")
    @GetMapping("download")
    public String download(HttpServletResponse response, @CasUser @ApiIgnore EamUser user, int num, String typeId) throws IOException, GetHardwareIdFailedException, InvalidSystemClockException {
        try {

            Response toolGroupBeanRes = ADOConnection.runTask(user.getCurrDs(), service, "getGroup", Response.class, typeId);
            ToolGroupBean toolGroupBean = (ToolGroupBean) toolGroupBeanRes.getData();
            if(!toolGroupBean.getHierarchy().equals("4")){
                return "请选择工器具类型";
            }

            // 这里注意 有同学反应使用swagger 会导致各种问题，请直接用浏览器或者用postman
            response.setCharacterEncoding("utf-8");
            // 这里URLEncoder.encode可以防止中文乱码 当然和easyexcel没有关系
            String fileName = URLEncoder.encode("toolTemplate", "UTF-8").replaceAll("\\+", "%20");
            response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
            response.setCharacterEncoding("utf-8");
            response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName + ".xlsx", "UTF-8"));

            ArrayList<ArrayList<String>> list = new ArrayList<>();
            // 提示语句
            ArrayList<String> tytleList = new ArrayList<String>();
            tytleList.add("注意：本表为工器具导入模板，第三行为示例数据，勿删。正式数据将从第四行开始导入");
            tytleList.add("");
            tytleList.add("");
            tytleList.add("");
            tytleList.add("");
            tytleList.add("");
            tytleList.add("");
            tytleList.add("");
            tytleList.add("");
            tytleList.add("");
            tytleList.add("");
            tytleList.add("");
            tytleList.add("");
            tytleList.add("");
            tytleList.add("");
            tytleList.add("");
            list.add(tytleList);
            // 表头
            ArrayList<String> sublistChina = new ArrayList<String>();
            sublistChina.add("序号");
            sublistChina.add("RFID (默认)");
            sublistChina.add("工具名称（必填）");
            sublistChina.add("工具分类 (必填)");
            sublistChina.add("型号");
            sublistChina.add("厂家");
            sublistChina.add("品牌");
            sublistChina.add("生产日期(yyyy/MM/dd)");
            sublistChina.add("入库日期(yyyy/MM/dd)");
            //sublistChina.add("生命周期");
            //sublistChina.add("检验周期（月）");
            sublistChina.add("报废日期（yyyy/MM/dd）");
            sublistChina.add("本次检验日期（默认当前日期）");
            sublistChina.add("下次检验日期（yyyy/MM/dd）");
            sublistChina.add("工器具分区（默认）");
            sublistChina.add("工具位置");
            sublistChina.add("工具编号");
            sublistChina.add("工具负责人账号");
            list.add(sublistChina);
            // 示例数据
            ArrayList<String> siLiData = new ArrayList<String>();
            siLiData.add("1");
            siLiData.add(UUID.randomUUID().toString().replace("-",""));
            siLiData.add("工具名称(必填)");
            siLiData.add("工具类型（必须是系统内存在的类型）");
            siLiData.add("工具型号(可不填)");
            siLiData.add("工具厂家(可不填)");
            siLiData.add("工具品牌(可不填)");
            SimpleDateFormat sdf = new SimpleDateFormat();// 格式化时间
            sdf.applyPattern("yyyy/MM/dd");// a为am/pm的标记
            Date date = new Date();// 获取当前时间
            siLiData.add(sdf.format(date));
            siLiData.add(sdf.format(date));
            siLiData.add(sdf.format(date));
            siLiData.add(sdf.format(date));
            siLiData.add(sdf.format(date));
            siLiData.add(toolGroupBean.getCode());
            siLiData.add("工具位置(可不填)");
            siLiData.add("工具编号(可不填)");
            siLiData.add("工具负责人账号(必填)");
            list.add(siLiData);

            for (int i = 0; i < num; i++) {
                //String codeAndRFID = DefaultIdGenerator.getInstance().generateLongId();

                ArrayList<String> sublist = new ArrayList<String>();
                int row = i+1;
                sublist.add(String.valueOf(row));
                sublist.add(Randt.getRandt());
                sublist.add("");
                sublist.add("");
                sublist.add("");
                sublist.add("");
                sublist.add("");
                sublist.add("");
                sublist.add("");
                //sublist.add("");
                //sublist.add("");
                sublist.add("");
                // 输出已经格式化的现在时间（24小时制）
                log.info("现在时间：" + sdf.format(date));
                sublist.add(sdf.format(date));
                sublist.add("");
                sublist.add(toolGroupBean.getCode());
                sublist.add("");
                sublist.add("");
                sublist.add("");
                list.add(sublist);
            }
            EasyExcel.write(response.getOutputStream()).needHead(true)
                    .excelType(ExcelTypeEnum.XLSX)
                    // 设置宽度
                    .registerWriteHandler(new ExcelWidthStyleStrategy())
                    .sheet(0, "sheet1")
                    // 内容
                    .doWrite(list);

            TypeIdSaveBean type = new TypeIdSaveBean();
            return "下载模板成功";
        } catch (Exception e) {
            log.error(e.getMessage(), e);
            return "下载模板失败";
        }

    }

}
